import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode root = head;

        int cnt = 0;
        ListNode pre = dummy;
        ListNode cur = root;
        while (cur != null) {
            // System.out.println("list : " + cur.val);
            cnt++;
            
            ListNode next = cur.next;
            
            if (cnt % k == 0) {
                ListNode temp = reverse(root, cur.next);
                pre.next = temp;

                root = next;

                for (int i = 0; i < k; i++) {
                    pre = pre.next;
                    // System.out.println("pre : " + pre.val);
                }
            }

            cur = next;
        }

        return dummy.next;
    }

    public ListNode reverse (ListNode head, ListNode tail) {

        // System.out.println(head.val);

        ListNode pre = tail;
        ListNode cur = head;

        while (cur != tail) {
            ListNode next = cur.next;

            cur.next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }
}